package robot.io.sorties;

import robot.IRobot;
import environnement.Environnement;

/**
 * Class Acceleration
 * Acceleration du robot
 */
public class Acceleration implements ISortie
{

    //
    // Attributs
    //
    /**
     * vitesse horizontale
     */
    private double vitX;
    /**
     * Vitesse verticale
     */
    private double vitY;
    /**
     * Vitesse à laquelle le robot avance (entre 0 et 1)
     */
    private double vitesse;
    /**
     * Acceleration (ajouté à la vitesse)
     */
    private double acceleration = 0.1;
    /**
     * Environnement
     */
    private Environnement env = Environnement.getInstance();

    //
    // Methods
    //
    //
    // Accessor methods
    //
    /**
     * Retourne la valeur de l'accélération actuelle
     */
    @Override
    public double getValeur()
    {
        return this.acceleration;
    }

    /**
     * Modifie la valeur du capteur
     */
    @Override
    public void setValeur(double valeur)
    {
        this.acceleration = valeur;
    }

    //
    // Other methods
    //
    /**
     * Modifie la valeur de l'accélération et déplace le robot
     * @param        robot Robot
     * @param        env Environnement global
     */
    public void action(IRobot robot)
    {

        // PUtin les commentaires nullos!!!!
        double dVitesseAncienne = this.vitesse;
        double newX = robot.getX();
        double newY = robot.getY();
        boolean test = false;

//        if (Math.tanh(this.acceleration) > 0)
//        {
//            this.vitesse = 1;
//        }
//        else if (Math.tanh(this.acceleration) < 0)
//        {
//            this.vitesse = -1;
//        }
//
        //this.vitesse = Math.tanh( this.vitesse + this.acceleration );
        this.vitesse = Math.abs( Math.tanh( this.vitesse + this.acceleration ) );
        
        System.out.println( "Real Angle : " + robot.getListe_Sorties()[robot.getIndex(Rotation.class.getName())].getValeur() );
        this.vitX += this.vitesse * Math.cos(robot.getListe_Sorties()[robot.getIndex(Rotation.class.getName())].getValeur());
        
        this.vitY += this.vitesse * Math.sin(robot.getListe_Sorties()[robot.getIndex(Rotation.class.getName())].getValeur());
        
//
//        if (Math.tanh(this.acceleration) > 0.5)
//        {
//            this.vitX = this.vitX + 1 * Math.cos(robot.getListe_Sorties()[robot.getIndex(Rotation.class.getName())].getValeur());
//            this.vitY = this.vitY + 1 * Math.sin(robot.getListe_Sorties()[robot.getIndex(Rotation.class.getName())].getValeur());
//
//        }
//        else if (Math.tanh(this.acceleration) < - 0.5)
//        {
//            this.vitX = this.vitX - 1 * Math.cos(robot.getListe_Sorties()[robot.getIndex(Rotation.class.getName())].getValeur());
//            this.vitY = this.vitY - 1 * Math.sin(robot.getListe_Sorties()[robot.getIndex(Rotation.class.getName())].getValeur());
//        }
//
//


        newX = this.vitX + (double) robot.getX();
        newY = this.vitY + (double) robot.getY();

        if (env.isInSmth((int) newX, (int) newY) == null || env.isInSmth((int) newX, (int) newY) == robot)
        {
            robot.setX((int) newX);
            robot.setY((int) newY);
        }

        System.out.print( "Mouvement du robot :" );
        System.out.print( "\tAngle : " + Math.toDegrees( robot.getListe_Sorties()[robot.getIndex(Rotation.class.getName())].getValeur() ) );
        System.out.print( "\tVitesses : " + this.vitX + ", " + this.vitY );
        System.out.println( "\tVitesse : " + this.vitesse );
        
        System.out.println( Math.floor( 0.4 ) );
        
        this.vitX = this.vitX - Math.floor( this.vitX );
        this.vitY = this.vitY - Math.floor( this.vitY );

        
//        if (dVitesseAncienne < this.vitesse)
//        {
//            for (double i = dVitesseAncienne; i <= this.vitesse; i = i + 0.1)
//            {
//                double oldX = this.vitX;
//                double oldY = this.vitY;
//
//                this.vitX = i * Math.cos(robot.getListe_Sorties()[robot.getIndex(Rotation.class.getName())].getValeur());
//                this.vitY = i * Math.sin(robot.getListe_Sorties()[robot.getIndex(Rotation.class.getName())].getValeur());
//
//            }
//
//        }
//        else
//        {
//        }


//
//        if (dVitesseAncienne < this.vitesse)
//        {
//            for (double i = dVitesseAncienne; i <= this.vitesse; i = i + 0.1)
//            {
//                double oldX = this.vitX;
//                double oldY = this.vitY;
//
//                this.vitX = i * Math.cos(robot.getListe_Sorties()[robot.getIndex(Rotation.class.getName())].getValeur());
//                this.vitY = i * Math.sin(robot.getListe_Sorties()[robot.getIndex(Rotation.class.getName())].getValeur());
//
//
//                newX = this.vitX + (double) robot.getX();
//                newY = this.vitY + (double) robot.getY();
//
//                // Si le robot est dans un endroit ou il ne devrait pas etre (objet endehors de l'environnement et lui-meme)
//                if (env.isInSmth((int) newX, (int) newY) != null && env.isInSmth((int) newX, (int) newY) != robot)
//                {
//                    newX = oldX + (double) robot.getX();
//                    newY = oldY + (double) robot.getY();
//                    test = true;
//                    break;
//                }
//
//            }
//
//            if (!test)
//            {
//                this.vitX = this.vitX + this.vitesse * Math.cos(robot.getListe_Sorties()[robot.getIndex(Rotation.class.getName())].getValeur());
//                this.vitY = this.vitY + this.vitesse * Math.sin(robot.getListe_Sorties()[robot.getIndex(Rotation.class.getName())].getValeur());
//
//
//                newX = this.vitX + (double) robot.getX();
//                newY = this.vitY + (double) robot.getY();
//
//            }
//
//        }
//        else
//        {
//            for (double i = dVitesseAncienne; i >= this.vitesse; i = i - 0.1)
//            {
//                double oldX = this.vitX;
//                double oldY = this.vitY;
//
//                this.vitX = i * Math.cos(robot.getListe_Sorties()[robot.getIndex(Rotation.class.getName())].getValeur());
//                this.vitY = i * Math.sin(robot.getListe_Sorties()[robot.getIndex(Rotation.class.getName())].getValeur());
//
//
//                newX = this.vitX + (double) robot.getX();
//                newY = this.vitY + (double) robot.getY();
//
//                // Si le robot est dans un endroit ou il ne devrait pas etre (objet endehors de l'environnement et lui-meme)
//                if (env.isInSmth((int) newX, (int) newY) != null && env.isInSmth((int) newX, (int) newY) != robot)
//                {
//                    newX = oldX + (double) robot.getX();
//                    newY = oldY + (double) robot.getY();
//
//                    test = true;
//                    break;
//                }
//            }
//
//            if (!test)
//            {
//                this.vitX = this.vitX + this.vitesse * Math.cos(robot.getListe_Sorties()[robot.getIndex(Rotation.class.getName())].getValeur());
//                this.vitY = this.vitY + this.vitesse * Math.sin(robot.getListe_Sorties()[robot.getIndex(Rotation.class.getName())].getValeur());
//
//
//                newX = this.vitX + (double) robot.getX();
//                newY = this.vitY + (double) robot.getY();
//            }
//
//
//        }
//
//        robot.setX((int) newX);
//        robot.setY((int) newY);




//		if( newX > 0 && newX < env.getLargeur() ) {
//			robot.setX( (int)newX );
//		}
//		else {
//			if( newX < 0 ) { robot.setX( 0 ); }
//			else if ( newX > env.getLargeur() ) { robot.setX( env.getLargeur() ); }
//		}
//		if( newY > 0 && newY < env.getLongueur() ) {
//			robot.setY( (int)newY );
//		}
//		else {
//			if( newY < 0 ) { robot.setY( 0 ); }
//			else if ( newY > env.getLongueur() ) { robot.setY( env.getLongueur() ); }
//		}
//


    }
}
